import api from '../utils/api'

// 认证服务
export const authService = {
  // 用户登录
  login: async (credentials) => {
    try {
      // 确保发送正确的请求格式
      const loginData = {
        username: credentials.username,
        password: credentials.password
      }
      console.log('发送登录请求:', loginData)
      
      const response = await api.post('/api/auth/login', loginData)
      console.log('登录响应:', response)
      
      // 统一处理返回格式，确保正确提取用户信息
      const userInfo = {
        id: response.userId || response.id, // 优先使用id，如果没有则使用userId
        userId: response.userId || response.id, // 保持向后兼容
        username: response.username,
        email: response.email,
        phoneNumber: response.phoneNumber,
        nickName: response.nickName,
        avatarUrl: response.avatarUrl,
        gender: response.gender,
        roles: response.roles,
        userType: response.userType
      }
      
      // 返回统一格式，存储逻辑由store处理
      return {
        token: response.token,
        refreshToken: response.refreshToken,
        userInfo: userInfo
      }
    } catch (error) {
      console.error('登录失败:', error)
      // 检查错误响应数据
      if (error.response && error.response.data) {
        console.error('错误响应数据:', error.response.data)
        // 如果后端返回了具体的错误信息，使用它
        if (error.response.data.message) {
          throw new Error(error.response.data.message)
        }
        // 如果是验证错误，提取字段错误信息
        if (error.response.data.errors) {
          const errorMessages = Object.values(error.response.data.errors).join(', ')
          throw new Error(errorMessages)
        }
      }
      throw error
    }
  },
  
  // 用户注册
  register: async (userData) => {
    try {
      console.log('authService: 发送注册请求', userData)
      
      // 构建符合后端期望的请求数据结构
      const requestData = {
        username: userData.username,
        password: userData.password,
        email: userData.email,
        phoneNumber: userData.phoneNumber || null,  // 使用用户输入的手机号码，如果没有则为null
        nickName: userData.username,  // 使用用户名作为默认昵称
        address: userData.address || null  // 使用用户输入的地址，如果没有则为null
      }
      
      console.log('authService: 处理后的请求数据', requestData)
      const data = await api.post('/api/auth/register', requestData)
      console.log('authService: 注册响应', data)
      // 统一处理返回格式，确保正确提取用户信息
      const userInfo = {
        id: data.userId || data.id, // 优先使用id，如果没有则使用userId
        userId: data.userId || data.id, // 保持向后兼容
        username: data.username,
        email: data.email,
        phoneNumber: data.phoneNumber,
        nickName: data.nickName,
        avatarUrl: data.avatarUrl,
        gender: data.gender,
        address: data.address,
        roles: data.roles,
        userType: data.userType
      }
      // 返回统一格式，存储逻辑由store处理
      // 返回统一格式
      return {
        token: data.token,
        refreshToken: data.refreshToken,
        userInfo: userInfo
      }
    } catch (error) {
      console.error('authService: 注册失败', error)
      
      // 检查错误响应数据
      if (error.response && error.response.data) {
        console.error('错误响应数据:', error.response.data)
        
        // 如果后端返回了具体的错误信息，使用它
        if (error.response.data.message) {
          // 创建一个新的错误对象，包含后端返回的错误信息
          const customError = new Error(error.response.data.message)
          customError.statusCode = error.response.status
          customError.customMessage = error.response.data.message
          throw customError
        }
        
        // 如果是验证错误，提取字段错误信息
        if (error.response.data.errors) {
          const errorMessages = Object.values(error.response.data.errors).join(', ')
          const customError = new Error(errorMessages)
          customError.statusCode = error.response.status
          customError.customMessage = errorMessages
          throw customError
        }
      }
      
      // 如果没有特定的错误信息，抛出原始错误
      throw error
    }
  },
  
  // 刷新令牌
  refreshToken: async (refreshToken) => {
    try {
      const data = await api.post(`/api/auth/refresh-token?refreshToken=${refreshToken}`)
      // 统一处理返回格式，确保正确提取用户信息
      const userInfo = {
        id: data.userId || data.id, // 优先使用id，如果没有则使用userId
        userId: data.userId || data.id, // 保持向后兼容
        username: data.username,
        email: data.email,
        phoneNumber: data.phoneNumber,
        nickName: data.nickName,
        avatarUrl: data.avatarUrl,
        gender: data.gender,
        roles: data.roles,
        userType: data.userType
      }
      // 返回统一格式，存储逻辑由store处理
      // 返回统一格式
      return {
        token: data.token,
        refreshToken: data.refreshToken,
        userInfo: userInfo
      }
    } catch (error) {
      throw error
    }
  },
  
  // 用户注销
  logout: async () => {
    try {
      await api.post('/api/auth/logout')
      // 清除逻辑由store统一处理
      return true
    } catch (error) {
      // 注销请求失败
      throw error
    }
  }
}

// 用户服务
export const userService = {
  // 获取用户信息
  getUserInfo: async (userId) => {
    try {
      return await api.get(`/api/users/${userId}`)
    } catch (error) {
      throw error
    }
  },

  // 获取用户详细信息（个人中心）
  getUserProfile: async () => {
    try {
      console.log('获取用户详细信息')
      const response = await api.get('/api/users/profile')
      console.log('获取用户详细信息响应:', response)
      return response
    } catch (error) {
      console.error('获取用户详细信息失败:', error)
      throw error
    }
  },

  // 更新用户基本信息
  updateProfile: async (userId, profileData) => {
    try {
      console.log('更新用户基本信息，用户ID:', userId)
      console.log('更新数据:', profileData)
      const response = await api.put(`/api/users/profile/${userId}`, profileData)
      console.log('更新用户基本信息响应:', response)
      return response
    } catch (error) {
      console.error('更新用户基本信息失败:', error)
      throw error
    }
  },

  // 修改用户密码
  changePassword: async (userId, passwordData) => {
    try {
      console.log('修改用户密码，用户ID:', userId)
      const response = await api.put(`/api/users/password/${userId}`, passwordData)
      console.log('修改用户密码响应:', response)
      return response
    } catch (error) {
      console.error('修改用户密码失败:', error)
      throw error
    }
  },

  // 更新用户头像
  updateAvatar: async (userId, avatarUrl) => {
    try {
      return await api.post(`/api/users/avatar/${userId}`, avatarUrl)
    } catch (error) {
      throw error
    }
  }
}